#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 该文件主要用于yaml文件处理的方法
import os
import yaml


class Yl:
    def file_path(self):
        """
        遍历testDate/filePath.yaml文件下filePath模块下的路径
        return 返回所有路径列表
        """
        # 找到当前文件目录的上一级目录,再拼接testData/file_path.yaml
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)), r"testData/filePath.yaml")
        with open(file_p, "r", encoding="utf-8") as f:  # with open语法打开文件时,系统会在代码块结束时自动关闭文件,释放资源
            f = yaml.load(f, Loader=yaml.FullLoader)  # 避免报警告需要加入:Loader=yaml.FullLoader
            for self.value in f.values():
                return self.value

    def get_mod_val(self, path_lst_index, module_n, lst_index):
        """
        yaml文件下,字典模式,下面有列表--读取文件下的具体模块下对应项的值
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        module_n  取该文件下的模块名
        lst_index 取该文件下的模块(列表)下对应项的索引(即位置)
        """
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, self.file_path()[path_lst_index]), "r", encoding="utf-8") as f:
            f = yaml.load(f, Loader=yaml.FullLoader)  # 避免报警告需要加入:Loader=yaml.FullLoader
            file_path = f[module_n][lst_index]
            return file_path

    def get_mod_all_val(self, path_lst_index, module_n):
        """
        yaml文件下,字典-列表模式存储数据,读取文件下的具体模块下所有的值
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        module_n  取该文件下的模块名
        """
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, self.file_path()[path_lst_index]), "r", encoding="utf-8") as f:
            f = yaml.load(f, Loader=yaml.FullLoader)  # 避免报警告需要加入:Loader=yaml.FullLoader
            file_path = f[module_n]
            return file_path

    def lst_val(self, path_lst_index, lst_index):
        """
        yaml文件下,列表模式存储数据--读取文件下的指定索引(即位置)的值
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        lst_index  取该文件下指定索引(即位置)
        """
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, self.file_path()[path_lst_index]), "r", encoding="utf-8") as f:
            f = yaml.load(f, Loader=yaml.FullLoader)  # 避免报警告需要加入:Loader=yaml.FullLoader
            yamlList = f[lst_index]
            return yamlList

    def write_cover(self, path_lst_index, w_data):
        """
        向yaml文件写入数据(会覆盖所有内容-慎用)
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        w_data  在该文件要写入的数据
        """
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, self.file_path()[path_lst_index]), "w", encoding='utf-8') as f:
            yaml.dump(w_data, f, encoding='utf-8', allow_unicode=True)

    def append_data(self, path_lst_index, a_data):
        """
        向yaml文件追加数据
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        a_data  在该文件要追加写入的数据
        """
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, self.file_path()[path_lst_index]), "a", encoding='utf-8') as f:
            yaml.dump(a_data, f, allow_unicode=True)

    def modify_data(self, path_lst_index, dict_n, value):
        """
        向以字典模式存储数据的yaml文件修改数据,并不影响其他数据
        如:已存在key则修改key对应的value,如果不存在的进行追加新的key-val
        path_lst_index   该文件路径在testDate/filePath.yaml文件下filePath模块下的路径索引(即位置)
        dict_n  在该文件要修改的key
        val  key的值
        """
        file_path = self.file_path()[path_lst_index]
        file_p = os.path.join(os.path.dirname(os.path.dirname(__file__)))
        with open(os.path.join(file_p, file_path), encoding='utf-8') as f:
            doc = yaml.safe_load(f)
        doc[dict_n] = value
        with open(os.path.join(file_p, file_path), 'w', encoding='utf-8') as f:
            yaml.safe_dump(doc, f, default_flow_style=False, encoding='utf-8',
                           allow_unicode=True)  # allow_unicode = True  # 解决中文乱码
